#include <eosio/eosio.hpp>
#include <eosio/time.hpp>
#include <eosio/system.hpp>
#include <eosio/singleton.hpp>
#include <eosio/asset.hpp>

/**
 * 合同 权限 验证 内联 操作 合同
 * jungle4 合同地址 twagcx5udvzb
 * ** eosio::action 操作 异常中断，事务会回滚 **
 */
CONTRACT permission_contract : public eosio::contract {
	public:
	using contract::contract;

	ACTION hasauth(eosio::name account) {
        eosio::print(has_auth(account));
    }

    ACTION reqauth(eosio::name account) {
        require_auth(account);
    }

    ACTION reqauth2(eosio::name account, eosio::name permission) {
        eosio::internal_use_do_not_use::require_auth2(account.value, permission.value);
        eosio::print(eosio::name(account));
        eosio::print('@');
        eosio::print(eosio::name(permission));
    }

    ACTION send(eosio::name sent, eosio::name p_sent, eosio::name req, eosio::name method) {
        eosio::action(eosio::permission_level{sent, p_sent},
           get_self(), method,
           std::make_tuple(req)
        ).send();
    }

    // 其它非 twagcx5udvzb 合同 执行
    // [method: reqauth2 p_req: active p_sent: active req: twagcx5udvzb sent: twagcx5udvzb]
    // 将会成功 ** 当您调用内联操作时，调用该操作的合约将成为新的发送者。**
    ACTION send2(
        eosio::name sent,
        eosio::name p_sent,
        eosio::name req,
        eosio::name p_req,
        eosio::name method
    ) {
        eosio::action(eosio::permission_level{sent, p_sent},
            get_self(), method,
            std::make_tuple(req, p_req)
        ).send();
    }
};